﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace Prueba
{
    public partial class MainForm : Form
    {
        private static Boolean completo = false;
        public MainForm()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                Herramientas.verificarDirectorio();
                cargarData();
                escribirWeb();
                webBrowser1.Navigate(Application.StartupPath + @"\HTML\MapaDeLotes.html");
            }
            catch (Exception)
            {

                MessageBox.Show("Error al intentar cargar los datos!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            
       }

        private void cargarData()
        {
            DataSet ds = DAOLotes.leerCoordenadas();
            try
            {
                if (ds != null)
                {
                    bindingSource1.DataSource = ds.Tables[0];
                    bindingNavigator1.BindingSource = bindingSource1;
                    dgvPuntos.DataSource = bindingSource1;
                    dgvPuntos.Columns[4].HeaderText = "Área/Radio(mts)";
                    dgvPuntos.Columns[5].HeaderText = "Humedad(%)";
                    dgvPuntos.Columns[6].HeaderText = "Último Control";
                    //cargar la cantidad de lotes sembrados
                    lblSembrados.Text = Estadisticas.obtenerCantidadLotesSembrados().ToString();
                    //cargar la cantidad de lotes cosechados
                    lblCosechados.Text = Estadisticas.obtenerCantidadLotesCosechados().ToString();
                    //cargar la cantidad total de lotes
                    lblTotal.Text = Estadisticas.obtenerCantidadLotes().ToString();
                    //cargar los 5 lotes de mayor humedad
                    String[] mayorHumedad = Estadisticas.obtenerLoteMayorHumedad();
                    lblMayorHumedad1.Text = mayorHumedad[0];
                    lblMayorHumedad2.Text = mayorHumedad[1];
                    lblMayorHumedad3.Text = mayorHumedad[2];
                    lblMayorHumedad4.Text = mayorHumedad[3];
                    lblMayorHumedad5.Text = mayorHumedad[4];
                    //cargar los 5 lotes de menor humedad
                    String[] menorHumedad = Estadisticas.obtenerLoteMenorHumedad();
                    lblMenorHumedad1.Text = menorHumedad[0];
                    lblMenorHumedad2.Text = menorHumedad[1];
                    lblMenorHumedad3.Text = menorHumedad[2];
                    lblMenorHumedad4.Text = menorHumedad[3];
                    lblMenorHumedad5.Text = menorHumedad[4];

                    tscmbFiltro.Text = "Filtrar por...";
                    tscmbFiltro.Items.Add("Campo");
                    tscmbFiltro.Items.Add("Lote");
                    tscmbFiltro.Items.Add("Fecha");
                    tscmbFiltro.Items.Add("Estado");
                    crearKML();
                    File.Copy(Application.StartupPath + @"\XML\MapaDeLotes.xml", Application.StartupPath + @"\TXT\MapaDeLotes.txt", true);
                    File.Copy(Application.StartupPath + @"\XML\MapaDeLotes.xml", Application.StartupPath + @"\KML\MapaDeLotes.kml", true);
                }
                else
                {
                    MessageBox.Show("Error al intentar cargar los datos!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch 
            {
                MessageBox.Show("Error al intentar cargar los datos!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
              }
        }
        private void tstxtFiltro_TextChanged(object sender, EventArgs e)
        {
            //filtros del dgv
            try
            {
                if (string.IsNullOrEmpty(tstxtFiltro.Text.Trim()))
                {
                    tsbtnBuscarPorFecha.Visible = false;
                    tsbtnBuscarPorFecha.Enabled = false;
                    this.bindingSource1.RemoveFilter();
                    return;
                }
                if (tscmbFiltro.Text.Equals("Campo"))
                {
                    tsbtnBuscarPorFecha.Visible = false;
                    tsbtnBuscarPorFecha.Enabled = false;
                    this.bindingSource1.Filter = "Campo LIKE '%" + this.tstxtFiltro.Text + "%'";
                }

                else if (tscmbFiltro.Text.Equals("Lote"))
                {
                    tsbtnBuscarPorFecha.Visible = false;
                    tsbtnBuscarPorFecha.Enabled = false;
                    this.bindingSource1.Filter = "Lote LIKE '%" + this.tstxtFiltro.Text + "%'";
                }

                else if (tscmbFiltro.Text.Equals("Estado"))
                {
                    tsbtnBuscarPorFecha.Visible = false;
                    tsbtnBuscarPorFecha.Enabled = false;
                    this.bindingSource1.Filter = "Estado LIKE '%" + this.tstxtFiltro.Text + "%'";
                }
                else if (tscmbFiltro.Text.Equals("Fecha"))
                {
                    tsbtnBuscarPorFecha.Visible = true;
                    tsbtnBuscarPorFecha.Enabled = true;
                }
            }
            catch (Exception) 
            {
                MessageBox.Show("Error al aplicar filtro!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);   
            }
        }

        private void tsbtnBuscarPorFecha_Click(object sender, EventArgs e)
        {
           //filtro por fecha
                try
                {
                    this.bindingSource1.Filter = "Ultimo_Control = '" + this.tstxtFiltro.Text + "'";
                }
                catch (Exception)
                {

                    MessageBox.Show("Ingrese una fecha completa!!" + (char)13 + "Ejemplo: 20/03/2013", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
               
            }

        private void crearKML()
        {
         //generar archivo kml
                DataSet coordenadas = DAOLotes.leerCoordenadas();
                try
                {
                    if (null != coordenadas)
                    {
                        string estilo = "";
                        string ruta = Application.StartupPath + @"\XML\MapaDeLotes.xml";
                        XmlTextWriter kml = new XmlTextWriter(ruta, null);
                        kml.Formatting = Formatting.Indented;
                        kml.Indentation = 3;

                        kml.WriteStartDocument();

                        kml.WriteStartElement("kml", "http://www.opengis.net/kml/2.2");
                        kml.WriteStartElement("Document");
                        kml.WriteElementString("name", "Mapa de Lotes");
                        kml.WriteStartElement("Folder");
                        for (int i = 0; i < coordenadas.Tables[0].Rows.Count; i++)
                        {
                            DataRow campo = coordenadas.Tables[0].Rows[i];

                            Double lat = Convert.ToDouble(campo["Latitud"].ToString());
                            Double longi = Convert.ToDouble(campo["Longitud"].ToString());
                            Double hum = Convert.ToDouble(campo["Humedad"].ToString());
                            Double area = Convert.ToDouble(campo["Area_Radio"].ToString());
                            if (campo["Estado"].ToString().Equals("Cosechado"))
                            {
                                estilo = "cosechado";
                            }
                            else if (campo["Estado"].ToString().Equals("Sembrado"))
                            {
                                if (hum == 0)
                                {
                                    estilo = "sindato";
                                }
                                else if (hum <= 25)
                                {
                                    estilo = "peligro";
                                }
                                else if (hum > 25 && hum < 32)
                                {
                                    estilo = "intermedio";
                                }
                                else if (hum >= 32)
                                {
                                    estilo = "seguro";
                                }
                            }


                            Herramientas.escribirKML(campo["Campo"].ToString(), campo["Lote"].ToString(), lat, longi, area, hum, campo["Ultimo_Control"].ToString(), campo["Estado"].ToString(), estilo, kml);

                        }
                        kml.WriteEndElement();  // Folder
                        kml.WriteEndElement();  // Document
                        kml.WriteEndDocument(); // <kml>
                        kml.Flush();
                        kml.Close();
                    }
                }
                catch
                {
                    MessageBox.Show("Error al intentar cargar los datos!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
}
        private void escribirWeb()
        {
            //crea la pagina HTML
            List<String> archivoKML = new List<string>();
            String pagina = "";
            String ubicacion = Application.StartupPath;
            try
            {
                archivoKML = Herramientas.leerArchivo(Application.StartupPath + @"\TXT", @"\MapaDeLotes.txt");
                if (null != archivoKML)
                {
                    pagina += "<!DOCTYPE html><html><head><title>Mapa de Lotes</title><script type='text/javascript' src='https://www.google.com/jsapi'></script></script>";
                    pagina += "<script type='text/javascript'>var ge;google.load('earth', '1');";
                    pagina += "function init() {google.earth.createInstance('map3d', initCallback, failureCallback);}";
                    pagina += "function initCallback(instance) {ge = instance;ge.getWindow().setVisibility(true);ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);";
                    pagina += "ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true);ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, true);";
                    pagina += "var puntos = ge.parseKml('";

                    foreach (String linea in archivoKML)
                    {
                        pagina += linea;
                    }
                    pagina += "');";
                    pagina += "ge.getFeatures().appendChild(puntos);var la = ge.createLookAt('');la.set(-34, -65, 0, ge.ALTITUDE_RELATIVE_TO_GROUND,0, 0, 4000000);ge.getView().setAbstractView(la);}";
                    pagina += "function failureCallback(errorCode) {}";
                    pagina += "function vistaPunto(latitud, longitud) {var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);";
                    pagina += "var lati = parseFloat(latitud); var longi = parseFloat(longitud);";
                    pagina += "lookAt.setLatitude(lati);lookAt.setLongitude(longi);lookAt.setRange(4000);ge.getView().setAbstractView(lookAt);}";
                    pagina += "</script></head><body onload='init()' style='font-family: arial, sans-serif; font-size: 13px; border: 0;'>";
                    pagina += "<div id='map3d' style='height: 609px; width: 900px;'></div></body></html>";
     
                    File.WriteAllText(Application.StartupPath + @"\HTML" + @"\MapaDeLotes.html", pagina);
                }
                else 
                {
                   MessageBox.Show("Error al intentar cargar la pagina!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch
            {
                MessageBox.Show("Error al intentar cargar la pagina!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
        {
            //abre el form ingresar
            Form existe = Application.OpenForms.OfType<Form>().Where(pre => pre.Name == "DatosLote").SingleOrDefault<Form>();

            if (existe != null)
            {

                existe.WindowState = FormWindowState.Normal;

            }
            else
            {
                DatosLote nuevo = new DatosLote();
                nuevo.Text = "Ingreso de Lote";
                nuevo.Show();
            }
           
        }

        private void tsbtnModificar_Click_1(object sender, EventArgs e)
        {
            //abre el form Modificar
            Form existe = Application.OpenForms.OfType<Form>().Where(pre => pre.Name == "DatosLote").SingleOrDefault<Form>();

            if (existe != null)
            {

                existe.WindowState = FormWindowState.Normal;

            }
            else
            {
                DatosLote.loteModificado = dgvPuntos.CurrentRow.Cells["Lote"].Value.ToString();
                DatosLote.area = dgvPuntos.CurrentRow.Cells["Area_Radio"].Value.ToString();
                DatosLote.campo = dgvPuntos.CurrentRow.Cells["Campo"].Value.ToString();
                DatosLote.lote = dgvPuntos.CurrentRow.Cells["Lote"].Value.ToString();
                DatosLote.longitud = dgvPuntos.CurrentRow.Cells["Longitud"].Value.ToString();
                DatosLote.latitud = dgvPuntos.CurrentRow.Cells["Latitud"].Value.ToString();
                DatosLote.humedad = dgvPuntos.CurrentRow.Cells["Humedad"].Value.ToString();
                DatosLote.estado = dgvPuntos.CurrentRow.Cells["Estado"].Value.ToString();
                DatosLote.fecha = dgvPuntos.CurrentRow.Cells["Ultimo_Control"].Value.ToString();

                DatosLote nuevo = new DatosLote();
                nuevo.Text = "Modificar Lote";
                
                nuevo.Show();
            }
        }

        private void tsbtnActualizar_Click(object sender, EventArgs e)
        {
            //actualiza el webBrowser y regenera todos los archivos
            try
            {
                Herramientas.verificarDirectorio();
                tscmbFiltro.Items.Clear();
                cargarData();
                escribirWeb();
                webBrowser1.Navigate(Application.StartupPath + @"\HTML\MapaDeLotes.html");
            }
            catch
            {
                MessageBox.Show("Error al intentar actualizar la página!!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnGraficos_Click(object sender, EventArgs e)
        {
            //abre el form Graficos
            Form existe = Application.OpenForms.OfType<Form>().Where(pre => pre.Name == "Graficos").SingleOrDefault<Form>();

            if (existe != null)
            {

                existe.WindowState = FormWindowState.Normal;

            }
            else
            {
                Graficos graficos = new Graficos();
                graficos.Show();
            }
            
        }

        private void dgvPuntos_SelectionChanged(object sender, EventArgs e)
        {
            //recorre punto por punto en el mapa si se cargo la pagina
            if (completo)
            {
                try
                {
                    if (null != dgvPuntos.CurrentRow.Cells["Latitud"].Value.ToString() && null != dgvPuntos.CurrentRow.Cells["Longitud"].Value.ToString())
                    {
                        object[] args = new object[2];
                        args[0] = dgvPuntos.CurrentRow.Cells["Latitud"].Value.ToString();
                        args[1] = dgvPuntos.CurrentRow.Cells["Longitud"].Value.ToString();

                        webBrowser1.Document.InvokeScript("vistaPunto", args);
                    }
                }
                catch (Exception)
                {
                  
                }
            }
            
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            //verifica que se cargo completamente la página
            completo = true;
        }

        private void tsbtnAyuda_Click(object sender, EventArgs e)
        {
            //muestra ayuda principal
            AyudaPrincipal ayuda = new AyudaPrincipal();
            ayuda.Show();
        }

        }
}

    


